package mastermind.dataholder;

import mastermind.logic.Game;

public class Row
{
	/**
	 * colors enth&auml;lt Zahlen, die die Farbe representieren<br>
	 * Die L&auml;nge von Colors entspricht der Anzahl der L&ouml;cher
	 */
	private byte[]	colors;
	/**
	 * cntRightPlace enth&auml;lt die Anzahl der richtigen (schwarzen)
	 * Bewertungspins
	 */
	private byte	cntRightPlace;
	/**
	 * cntRightPlace enth&auml;lt die Anzahl der falscher (wei&szlig;er)
	 * Bewertungspins
	 */
	private byte	cntWrongPlace;

	/**
	 * Erzeugt eine leere Reihe, dass hei&szlig;t alle L&ouml;cher sind noch
	 * leer und es gibt 0 falsche (wei&szlig;e) und 0 richtige (schwarze)
	 * Bewertungspins
	 */
	public Row()
	{
		colors = new byte[Game.getCntHoles()];
	}

	/**
	 * Erzeugt eine neue Reihe, bei der die L&ouml;cher bereits gef&uuml;llt
	 * sind.<br/>
	 * Es gibt 0 falsche (wei&szlig;e) und 0 richtige (schwarze) Bewertungspins
	 * 
	 * @param colors
	 *            Farben, mit denen die L&ouml;cher belegt werden
	 */
	public Row(byte[] colors)
	{
		this.colors = colors;
	}

	/**
	 * Dieser Konstruktor rekustruiert eine Row anhand eines Strings.<br>
	 * Der String ist so aufgebaut, wie <code>Row.toString()</code> ihn ausgibt
	 * und wie er in der Datei abgespeichert ist.
	 * 
	 * @param loadString
	 *            String, der in eine Row zur&uuml;ckumgewandelt werden soll.
	 */
	public Row(String loadString)
	{
		this();
		for (int i = 0; i < colors.length; i++)
		{
			String s = loadString.substring(i, i + 1);
			if (s.equals("X"))
			{
				colors[i] = -1;
			}
			else
			{
				colors[i] = Byte.parseByte(s);
			}
		}
		String[] count = loadString.split("\\|");
		cntRightPlace = Byte.parseByte(count[1]);
		cntWrongPlace = Byte.parseByte(count[2]);
	}

	/**
	 * Erzeugt eine neue Reihe, bei der die L&ouml;cher bereits gef&uuml;llt
	 * sind.<br/>
	 * Anzahl an falschen (wei&szlig;en) und richtigen (schwarzen)
	 * Bewertungspins wird auch mit angegeben.
	 * 
	 * @param colors
	 *            Farben, mit denen die L&ouml;cher belegt werden
	 * @param right
	 *            Anzahl richtiger (schwarzer) Bewertungspins
	 * @param wrong
	 *            Anzahl falscher (wei&szlig;er) Bewertungspins
	 */
	public Row(byte[] colors, byte right, byte wrong)
	{
		this(colors);
		cntRightPlace = right;
		cntWrongPlace = wrong;
	}

	/**
	 * Liefert die gesetzten Farben als <code>byte[]</code> zur&uuml;ck
	 * 
	 * @return Gesetzte Farben
	 */
	public byte[] getColors()
	{
		return colors;
	}

	/**
	 * Setzt an die Stelle <code>pos</code> einen Pin mit der Farbe-Id
	 * <code>colorid</code>
	 * 
	 * @param pos
	 *            Position, an der die Farbe gesetzt wird
	 * @param colorid
	 *            Farb-Id, die an <code>pos</code> gesetzt wird.
	 */
	public void setColor(byte pos, byte colorid)
	{
		colors[pos] = colorid;
	}

	/**
	 * Liefert die Anzahl an richtigen (schwarzen) Bewertungspins zur&uuml;ck
	 * 
	 * @return Anzahl richtiger (schwarzer) Bewertungspins
	 */
	public byte getRightPlaces()
	{
		return cntRightPlace;
	}

	/**
	 * Liefert die Anzahl an falschen (wei&szlig;en) Bewertungspins zur&uuml;ck
	 * 
	 * @return Anzahl falscher (wei&szlig;er) Bewertungspins
	 */
	public byte getWrongPlaces()
	{
		return cntWrongPlace;
	}

	/**
	 * Setzt die Anzahl richtiger (schwarzer) Bewertungspins
	 * 
	 * @param value
	 *            Anzahl richtiger (schwarzer) Bewertungspins
	 */
	public void setRightPlaces(byte value)
	{
		cntRightPlace = value;
	}

	/**
	 * Setzt die Anzahl falscher (wei&szlig;er) Bewertungspins
	 * 
	 * @param value
	 *            Anzahl falscher (wei&szlig;er) Bewertungspins
	 */
	public void setWrongPlaces(byte value)
	{
		cntWrongPlace = value;
	}

	/**
	 * Gibt die Farb-Id an der Stelle <code>pos</code> zur&uuml;ck
	 * 
	 * @param pos
	 *            Position, die ausgelesen werden soll
	 * @return Farb-Id an der Stelle <code>pos</code>
	 */
	public byte getColor(int pos)
	{
		return colors[pos];
	}

	/**
	 * Gibt eine Row als String zur&uuml;ck<br/>
	 * Dieser String wird auch als loadString im Konstruktor verwendet, um aus
	 * einem String wieder eine Row zu erstellen
	 */
	@Override
	public String toString()
	{
		String s = "";
		for (int i = 0; i < colors.length; i++)
		{
			if (colors[i] == -1)
				s += "X";
			else
				s += colors[i];
		}
		s += "|" + cntRightPlace + "|" + cntWrongPlace;
		return s;
	}

}
